package cn.trinea.android.demo.eventbus; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; import cn.trinea.android.common.util.ListUtils; import cn.trinea.android.common.util.TimeUtils; import cn.trinea.android.demo.eventbus.util.AppUtils; import cn.trinea.android.demo.eventbus.util.TextUtils; import de.greenrobot.event.EventBus; /** * ViewPager with Fragment * * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2012-11-14 */ public class ViewPagerDemo extends BaseFragmentActivity { private static int TOTAL_COUNT = 3; private EditText eventET; private Button sendBtn; private CheckBox cancelEventCB; private RelativeLayout viewPagerContainer; private ViewPager viewPager; boolean isCancelAfterFirstTime = false; private void initView() { eventET = (EditText)findViewById(R.id.event_content); sendBtn = (Button)findViewById(R.id.send_event); cancelEventCB = (CheckBox)findViewById(R.id.event_cancel); sendBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(TextUtils.getHintIfTextIsNull(eventET)); } }); viewPager = (ViewPager)findViewById(R.id.view_pager); List<Fragment> fragmentList = new ArrayList<Fragment>(); List<String> titleList = new ArrayList<String>(); for (int i = 0; i < TOTAL_COUNT; i++) { TextFragment viewPagerFragment1 = new TextFragment(); Bundle bundle = new Bundle(); bundle.putInt("index", i); viewPagerFragment1.setArguments(bundle); titleList.add("title " + i); fragmentList.add(viewPagerFragment1); } // to let show more than one fragment at the same time, see // http://www.trinea.cn/android/viewpager-multi-fragment-effect/ viewPager.setOnPageChangeListener(new MyOnPageChangeListener()); viewPagerContainer = (RelativeLayout)findViewById(R.id.pager_layout); viewPagerContainer.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // dispatch the events to the ViewPager, to solve the problem that we can swipe only the middle view. return viewPager.dispatchTouchEvent(event); } }); viewPager.setOffscreenPageLimit(TOTAL_COUNT); int pageSpace = getResources().getDimensionPixelSize(R.dimen.page_margin); viewPager.setPageMargin(pageSpace); viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(), fragmentList, titleList)); viewPager.setCurrentItem(1); int margin = (AppUtils.getScreenWidth(getApplicationContext()) + pageSpace * (TOTAL_COUNT - 1)) / TOTAL_COUNT; LayoutParams viewPagerParams = (LayoutParams)viewPager.getLayoutParams(); viewPagerParams.setMargins(margin, 0, margin, 0); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.activity_send_ordered_event); initView(); } public class MyOnPageChangeListener implements OnPageChangeListener { @Override public void onPageSelected(int position) {} @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // to refresh frameLayout if (viewPagerContainer != null) { viewPagerContainer.invalidate(); } } @Override public void onPageScrollStateChanged(int arg0) {} } private class MyPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; private List<String> titleList; public MyPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList) { super(fm); this.fragmentList = fragmentList; this.titleList = titleList; } @Override public Fragment getItem(int arg0) { return ListUtils.isEmpty(fragmentList) ? null : fragmentList.get(arg0); } @Override public CharSequence getPageTitle(int position) { return (titleList.size() > position) ? titleList.get(position) : ""; } @Override public int getCount() { return fragmentList == null ? 0 : fragmentList.size(); } } private class TextFragment extends Fragment { private int index; private TextView infoTV; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_text_view, container, false); infoTV = (TextView)v.findViewById(R.id.view_pager_text); Bundle bundle = getArguments(); if (bundle != null) { index = bundle.getInt("index"); infoTV.setText("Fragment " + index); } // Register EventBus.getDefault().register(this, index); return v; } @Override public void onDestroyView() { // Unregister EventBus.getDefault().unregister(this); super.onDestroyView(); } // Receive Event public void onEvent(String event) { infoTV.setText(event + "\r\nPriority is:" + (index + 1) + "\r\nTime is:\r\n" + TimeUtils.getCurrentTimeInString()); if (index == TOTAL_COUNT - 1 && cancelEventCB.isChecked()) { EventBus.getDefault().cancelEventDelivery(event); infoTV.setText(infoTV.getText() + "\r\nCancel further event delivery"); } } } }